package com.rc.common.config;

import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import com.rc.common.constant.RoleEnum;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * Web MVC配置类
 * 配置拦截器、资源处理器等
 */
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {

    /**
     * 创建Sa-Token拦截器
     * @return SaInterceptor实例
     */
    public SaInterceptor saInterceptor(){
        // 获取角色描述
        String admin = RoleEnum.ADMIN.getDesc();
        String farmAdmin = RoleEnum.FARM_ADMIN.getDesc();
        String employee = RoleEnum.EMPLOYEE.getDesc();
        String consumer = "consumer";

        // 创建并配置拦截器
        return new SaInterceptor(handler -> {
            // 地址相关接口需要消费者角色
            SaRouter.match("/address/**").check(r -> StpUtil.checkRole(consumer))
                    .check(StpUtil::checkLogin);

            // 农场申请相关接口需要管理员角色
            SaRouter.match("/farmApply/**").check(r -> StpUtil.checkRole(admin));

            // 区域相关接口需要农场管理员或管理员角色
            SaRouter.match("/area/**").check(r -> StpUtil.checkRoleOr(farmAdmin,admin));

            // 植物相关接口需要管理员角色
            SaRouter.match("/plant/**").check(r -> StpUtil.checkRoleOr(admin));

            // 文件相关接口（已注释）
            // SaRouter.match("/file/**").check(r -> StpUtil.checkRoleOr(admin,farmAdmin,consumer));
        });
    }

    /**
     * 添加拦截器
     * @param registry 拦截器注册表
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(saInterceptor())
                .addPathPatterns("/**")
                ;
    }

    /**
     * 添加资源处理器
     * @param registry 资源处理器注册表
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 配置Swagger文档资源
        registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}
